package com.nextel.project.pedido.bean;

import com.nextel.project.cliente.bean.ClienteBean;
import com.nextel.project.usuario.bean.UsuarioBean;
import pe.com.nextel.rms.DataInputStreamX;
import pe.com.nextel.rms.DataOutputStreamX;
import pe.com.nextel.rms.PersistenteX;
import java.io.IOException;

import org.kxml2.io.KXmlParser;
import org.kxml2.io.KXmlSerializer;
import pe.com.nextel.util.ArrayList;
import pe.com.nextel.util.Fecha;
import pe.com.nextel.util.List;
import pe.com.nextel.util.StringUtils;
import pe.com.nextel.util.math.MathUtil;

/**
 *
 *
 */
public class PedidoBean extends PersistenteX {
    
    public static final byte TIPO_PEDIDO = 1;
    public static final byte TIPO_NO_PEDIDO = 2;
    
    private String codigoServidor;
    private long fechaInicio;
    
    private long fechaFin;
    
    private String codigoListaPrecio;
    private String condicionVenta;
    
    private String codigoCliente;
    
    private String codigoMotivo ="";
    private String montoTotal;
    private String cantidadTotal;
    
    private String empresa;
    private String codigoUsuario;
    
    public int latitud;
    public int longitud;    
    public String celda;
    public int ErrorPosicion;
    public int ErrorConexion;
    
    private List lstPedidoDetalle;
    private String observaciones;
    
    public PedidoBean(UsuarioBean pusuario, ClienteBean pcliente) {
        
        codigoUsuario   = pusuario.getCodigo();
        empresa         = pusuario.getCompania();
        codigoCliente   = pcliente.getCodigo();
        setLstPedidoDetalle(new ArrayList());
    }
    
    /**
     * No usar solo en RMS
     */
    public PedidoBean() {
        //usuario = new UsuarioBean();
        //cliente = new ClienteBean();
        setLstPedidoDetalle(new ArrayList());
    }
    
    public void persistir(DataOutputStreamX dataOutput, List list) throws IOException {
        
        dataOutput.writeString(StringUtils.stringNullToBlank(getEmpresa()));
        dataOutput.writeString(StringUtils.stringNullToBlank(getCodigoUsuario()));
        dataOutput.writeLong(getFechaInicio());
        dataOutput.writeLong(getFechaFin());
        dataOutput.writeString(StringUtils.stringNullToBlank(getCondicionVenta()));
        
        dataOutput.writeString(StringUtils.stringNullToBlank(getCodigoCliente()));
        dataOutput.writeString(StringUtils.stringNullToBlank(getCodigoMotivo()));
        dataOutput.writeString(StringUtils.stringNullToBlank(getMontoTotal()));
        
        dataOutput.writeInt(latitud);
        dataOutput.writeInt(longitud);
        dataOutput.writeString(StringUtils.stringNullToBlank(celda));
        
        dataOutput.writeInt(ErrorConexion);
        dataOutput.writeInt(ErrorPosicion);
        
        dataOutput.writeString(StringUtils.stringNullToBlank(getObservaciones())); //aMendiola 21/09/2010        
        dataOutput.writeString(StringUtils.stringNullToBlank(getCantidadTotal()));
        
        
        int cant = getLstPedidoDetalle().size();
//      System.out.println("---->Cant==" + cant);
        dataOutput.writeInt(cant);                
                
        ////////////////////////////////////////////////////////
//        System.out.println("getEmpresa()="+getEmpresa());
//        System.out.println("cab.CodPedido ="+getCodigoServidor());
//        System.out.println("cab.IdUsuario ="+getCodigoUsuario());
//        System.out.println("cab.FecInicio = "+getFechaInicio());
//        System.out.println("cab.FecFin = "+getFechaFin());
//
//        System.out.println("cab.IdFormaPago ="+getCondicionVenta());
//        System.out.println("cab.IdDirVisita ="+getCodigoEstablecimiento());
//        System.out.println("cab.IdCanal ="+getCodigoListaPrecio());
//        System.out.println("cab.IdMoneda ="+getCodigoMoneda());
//        System.out.println("cab.IdRuta ="+getRuta());
//
//        System.out.println("cab.IdCliente ="+getCodigoCliente());
//        System.out.println("cab.CodMotivo ="+getCodigoMotivo());
//        System.out.println("cab.MontoTotal ="+getMontoTotal());
//
//        System.out.println("cantidad =" + cant);
        ////////////////////////////////////////////////////////
        
        if (cant > 0) {
            
            PedidoDetalleBean pedidoDetalle = new PedidoDetalleBean();
            
            pedidoDetalle.persistir(dataOutput, getLstPedidoDetalle());
//
            pedidoDetalle = null;
        }
    }
    
    public List recuperar(DataInputStreamX dataInput) throws IOException {
        
        setEmpresa(dataInput.readString());
        setCodigoUsuario(dataInput.readString());
        //setFechaInicio(dataInput.readString());
        setFechaInicio(dataInput.readLong());
        //setFechaFin(dataInput.readString());
        setFechaFin(dataInput.readLong());
        setCondicionVenta(dataInput.readString());
        
        
        setCodigoCliente(dataInput.readString());
        setCodigoMotivo(dataInput.readString());
        setMontoTotal(dataInput.readString());
        
        latitud = dataInput.readInt();
        longitud = dataInput.readInt();
        celda = dataInput.readString();
        
        ErrorConexion = dataInput.readInt();
        ErrorPosicion = dataInput.readInt();
        
        setObservaciones(dataInput.readString()); //aMendiola 21/09/2010
        
        setCantidadTotal(dataInput.readString());
        
        int i = dataInput.readInt();                
        
        ////////////////////////////////////////////////////////
        /*System.out.println("getEmpresa()="+getEmpresa());
        System.out.println("cab.CodPedido ="+getCodigoServidor());
        System.out.println("cab.IdUsuario ="+getCodigoUsuario());
        System.out.println("cab.FecInicio = "+getFechaInicio());
        System.out.println("cab.FecFin = "+getFechaFin());
         
        System.out.println("cab.IdFormaPago ="+getCondicionVenta());
        System.out.println("cab.IdDirVisita ="+getCodigoEstablecimiento());
        System.out.println("cab.IdCanal ="+getCodigoListaPrecio());
        System.out.println("cab.IdMoneda ="+getCodigoMoneda());
        System.out.println("cab.IdRuta ="+getRuta());
         
        System.out.println("cab.IdCliente ="+getCodigoCliente());
        System.out.println("cab.CodMotivo ="+getCodigoMotivo());
        System.out.println("cab.MontoTotal ="+getMontoTotal());
         
        System.out.println("Latitud ="+getLatitud());
        System.out.println("Longitud ="+getLongitud());
         
        System.out.println("cantidad =" + i);
         */
        ////////////////////////////////////////////////////////
        
        
        if (i > 0) {
            PedidoDetalleBean pedidoDetalle = new PedidoDetalleBean();
            setLstPedidoDetalle(pedidoDetalle.recuperar(dataInput));
            pedidoDetalle = null;
        }
        
        return null;
    }
    
    public void writeXMLObject(KXmlSerializer writer) throws IOException {
        
//        System.out.println("PedidoBean.writeXMLObject");
        String[] fechaInicios = Fecha.convertTimeSSLongToString(getFechaInicio( ));
        String[] fechaFin1 = Fecha.convertTimeSSLongToString(getFechaFin());
        
        writer.startTag(null,"p");
        
        writer.attribute(null,"e",  StringUtils.stringNullToBlank(empresa));
        writer.attribute(null, "u", StringUtils.stringNullToBlank(codigoUsuario));
        writer.attribute(null,"fi", fechaInicios[0] + ' ' + fechaInicios[1]);
        writer.attribute(null,"ff", fechaFin1[0] + ' ' + fechaFin1[1]);
        writer.attribute(null,"cv", StringUtils.stringNullToBlank(getCondicionVenta()));
        
        writer.attribute(null,"cc", StringUtils.stringNullToBlank(codigoCliente));
        writer.attribute(null,"mt", StringUtils.stringNullToBlank(getMontoTotal()));
        writer.attribute(null,"la", String.valueOf(latitud));
        writer.attribute(null,"lo", String.valueOf(longitud));
        writer.attribute(null,"ce", StringUtils.stringNullToBlank(celda));
        
        writer.attribute(null,"ec", String.valueOf(ErrorConexion));
        writer.attribute(null,"ep", String.valueOf(ErrorPosicion));
        
        writer.attribute(null,"cm", StringUtils.stringNullToBlank(getCodigoMotivo()));
        writer.attribute(null,"ob", StringUtils.stringNullToBlank(getObservaciones()));
        
        writer.attribute(null,"ct", StringUtils.stringNullToBlank(getCantidadTotal()));
        
        int cant =  getLstPedidoDetalle().size();

//        System.out.println("cant =" + cant );
        PedidoDetalleBean elem;
        for(int i=0; i<cant;i++){
            elem = (PedidoDetalleBean)getLstPedidoDetalle().get(i);
            elem.writeXMLObject(writer);
        }
        
//        System.out.println("fin");
        
        writer.endTag(null, "p");
        
    }
    
    
    public void readXMLObject(KXmlParser parser) throws IOException {
        codigoServidor = parser.getAttributeValue(null, "c");
    }
    
    public void setDetallePedido(PedidoDetalleBean bean) {
        //  System.out.println("setDetallePedido");
        
        if (!existeArticulo(bean)) {
            //   System.out.println("agregado");
            getLstPedidoDetalle().add(bean);
        }
    }
    
    public void removeArticulo(String codigo) {
        for (int j = getLstPedidoDetalle().size() - 1; j >= 0; j--) {
            PedidoDetalleBean elem = (PedidoDetalleBean) getLstPedidoDetalle().get(j);
//            System.out.println("codigo=" + codigo + "|");
//            System.out.println("elem.getCodigoArticulo()=" + elem.getCodigoArticulo()+"|");
            if (elem.getCodigoArticulo().equals(codigo)) {
                getLstPedidoDetalle().remove(j);
                break;
            }
        }
    }
    
    public boolean existeArticulo(PedidoDetalleBean bean) {
        //System.out.println("existeArticulo");
        boolean flag = false;
        
        for (int j = getLstPedidoDetalle().size() - 1; j >= 0; j--) {
            
            PedidoDetalleBean elem = (PedidoDetalleBean) getLstPedidoDetalle().get(j);
            
            if (elem.getCodigoArticulo().equals(bean.getCodigoArticulo())) {
                //  System.out.println("articulo existe");
                flag = true;
                break;
            }
            
        }
        return flag;
    }
    
    public PedidoDetalleBean getDetallePedido(String codigoArticulo) {
        
        //     System.out.println("getArticulo.getLstPedidoDetalle(=" + getLstPedidoDetalle().size() );
        PedidoDetalleBean elem = null;
        for (int j = getLstPedidoDetalle().size() - 1; j >= 0; j--) {
            // System.out.println("entra?");
            elem = (PedidoDetalleBean) getLstPedidoDetalle().get(j);
            if (elem.getCodigoArticulo().equals(codigoArticulo)) {
                //     System.out.println("es igual?");
                return elem;
            }
        }
        //  System.out.println("final ");
        return null;
    }
    
    /**
     * Calcula el monto total en la moneda del pedido
     */
    public void calcularMontoTotal() {
        
        setMontoTotal("0");
        
        for (int i = 0; i < getLstPedidoDetalle().size(); i++) {
            PedidoDetalleBean elem = (PedidoDetalleBean) getLstPedidoDetalle().get(i);
            
            setMontoTotal(MathUtil.sumar(getMontoTotal(), elem.getMonto()));
            
            
        }
    }
    
    public String calcularCantidadTotal() {
        
        String cantidad ="0";
        for (int i = 0; i < getLstPedidoDetalle().size(); i++) {
            
            PedidoDetalleBean elem = (PedidoDetalleBean) getLstPedidoDetalle().get(i);
            
            cantidad = (MathUtil.sumar(cantidad, elem.getCantidad()));
             setCantidadTotal(cantidad);
            
        }
        
        return cantidad;
    }
    
//    public String getCodigoMoneda() {
//        return codigoMoneda;
//    }
//
//    public void setCodigoMoneda(String CodigoMoneda) {
//        this.codigoMoneda = CodigoMoneda;
//    }
    
//    public String getCodigoEstablecimiento() {
//        return codigoEstablecimiento;
//    }
//
//    public void setCodigoEstablecimiento(String codigoEstablecimiento) {
//        this.codigoEstablecimiento = codigoEstablecimiento;
//    }
    
    public String getCodigoListaPrecio() {
        return codigoListaPrecio;
    }
    
    public void setCodigoListaPrecio(String codigoListaPrecio) {
        this.codigoListaPrecio = codigoListaPrecio;
    }
    
    public String getCodigoMotivo() {
        return codigoMotivo;
    }
    
    public void setCodigoMotivo(String codigoMotivo) {
        this.codigoMotivo = codigoMotivo;
    }
    
    public String getCodigoServidor() {
        return codigoServidor;
    }
    
    public void setCodigoServidor(String codigoServidor) {
        this.codigoServidor = codigoServidor;
    }
    
    public String getCondicionVenta() {
        return condicionVenta;
    }
    
    public void setCondicionVenta(String condicionVenta) {
        this.condicionVenta = condicionVenta;
    }
    
//    public byte getEstadoPedido() {
//        return estadoPedido;
//    }
//
//    public void setEstadoPedido(byte estadoPedido) {
//        this.estadoPedido = estadoPedido;
//    }
    
    public long getFechaFin() {
        return fechaFin;
    }
    
    public void setFechaFin(long fechaFin) {
        this.fechaFin = fechaFin;
    }
    
    public long getFechaInicio() {
        return fechaInicio;
    }
    
    public void setFechaInicio(long fechaInicio) {
        this.fechaInicio = fechaInicio;
    }
    
    
    public List getLstPedidoDetalle() {
        return lstPedidoDetalle;
    }
    
    public void setLstPedidoDetalle(List lstPedidoDetalle) {
        this.lstPedidoDetalle = lstPedidoDetalle;
    }
    
    
    public String getCantidadTotal() {
        return cantidadTotal;
    }
    
    public void setCantidadTotal(String cantidad) {
        this.cantidadTotal = cantidad;
    }
    
    
    
    public String getMontoTotal() {
        return montoTotal;
    }
    
    public void setMontoTotal(String montoTotal) {
        this.montoTotal = montoTotal;
    }
    
    public void clear() {
        
        if (lstPedidoDetalle != null) {
            lstPedidoDetalle.clear();
            lstPedidoDetalle = null;
        }
        
    }
    
//    /**
//     * @return the ruta
//     */
//    public String getRuta() {
//        return ruta;
//    }
//
//    /**
//     * @param ruta the ruta to set
//     */
//    public void setRuta(String ruta) {
//        this.ruta = ruta;
//    }
    
    /**
     * @return the empresa
     */
    public String getEmpresa() {
        return empresa;
    }
    
    /**
     * @param empresa the empresa to set
     */
    public void setEmpresa(String empresa) {
        this.empresa = empresa;
    }
    
    /**
     * @return the codigoUsuario
     */
    public String getCodigoUsuario() {
        return codigoUsuario;
    }
    
    /**
     * @param codigoUsuario the codigoUsuario to set
     */
    public void setCodigoUsuario(String codigoUsuario) {
        this.codigoUsuario = codigoUsuario;
    }
    
    public String getCodigoCliente() {
        return codigoCliente;
    }
    
    public void setCodigoCliente(String codigoCliente) {
        this.codigoCliente = codigoCliente;
    }

    public String getObservaciones() {
        return StringUtils.stringNullToBlank(observaciones);
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }
    
}
